package servidor;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

public class MgrLoggin {
	private DadosLog lblLog = new DadosLog();
	private final String PERSISTENCE_UNIT_NAME = "ServerAndroid";
	private EntityManagerFactory factory =  Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
	//Login----------------------------------------------------------------------
	
	public boolean loginAlunoAtividade(long raAluno, String senha, String codAtividade){		
		try{
			EntityManager em = factory.createEntityManager();
			Query login = em.createQuery("SELECT a FROM Aluno a WHERE a.RA = :raAluno AND a.senha = :senha");
			login.setParameter("raAluno", raAluno);
			login.setParameter("senha", senha);
			Aluno aluno = (Aluno) login.getSingleResult();
			if (aluno != null){
				aluno.setLogado(1);
				em.getTransaction().begin();
				em.merge(aluno);
				em.getTransaction().commit();
				gravaLog(lblLog._alunoLogin+raAluno, null, lblLog._tipoCadastro);
				return true;
			}
			else
			{
				gravaLog(lblLog._erroQuery, "Login Aluno", lblLog._tipoQuery);
				return false;
			}
		}catch(Exception e){
			gravaLog(lblLog._erroLogin+raAluno, null, lblLog._tipoExcecao);
			return false;
		}
	}
	
	public boolean loginAluno(long raAluno, String senha){		
		try{
			EntityManager em = factory.createEntityManager();
			Query login = em.createQuery("SELECT a FROM Aluno a WHERE a.RA = :raAluno AND a.senha = :senha");
			login.setParameter("raAluno", raAluno);
			login.setParameter("senha", senha);
			Aluno aluno = (Aluno) login.getSingleResult();
			if (aluno != null){
				aluno.setLogado(1);
				em.getTransaction().begin();
				em.merge(aluno);
				em.getTransaction().commit();
				gravaLog(lblLog._alunoLogin+raAluno, null, lblLog._tipoCadastro);
				return true;
			}
			else
			{
				gravaLog(lblLog._erroQuery, "Login Aluno", lblLog._tipoQuery);
				return false;
			}
		}catch(Exception e){
			gravaLog(lblLog._erroLogin+raAluno, null, lblLog._tipoExcecao);
			return false;
		}
	}
	public boolean loginProfessor(long raProfessor, String senha){
		try{
			Professor professor = null;
			EntityManager em = factory.createEntityManager();
			Query login = em.createQuery("SELECT a FROM Professor a WHERE a.RA = :raProfessor AND a.senha = :senha");
			login.setParameter("raProfessor", raProfessor);
			login.setParameter("senha", senha);
			professor = (Professor) login.getSingleResult();
			if (professor != null){
				professor.setLogado(1);
				em.getTransaction().begin();
				em.merge(professor);
				em.getTransaction().commit();
				gravaLog(lblLog._professorLogin+raProfessor,null, lblLog._tipoCadastro);
				return true;
			}
			else
			{
				gravaLog(lblLog._erroQuery, "Login Professor", lblLog._tipoQuery);			
				return false;
			}
		}catch(Exception e){
			gravaLog(lblLog._erroLogin+raProfessor, null, lblLog._tipoExcecao);
			return false;
		}
	}	
	public int isAlunoLogado(long raAluno, String senhaAluno){
		try{
			Aluno aluno = null;
			EntityManager em = factory.createEntityManager();
			Query logado = em.createQuery("SELECT a FROM Aluno a WHERE a.RA = :raAluno AND a.senha = :senha");
			logado.setParameter("raAluno", raAluno);
			logado.setParameter("senha", senhaAluno);
			aluno = (Aluno) logado.getSingleResult();
			em.close();
			return aluno.getLogado();
		}catch(Exception e){
			return 0;
		}
		
	}
	public int isProfessorLogado(long raProfessor, String senhaProfessor){
		try{
			Professor professor = null;
			EntityManager em = factory.createEntityManager();
			Query logado = em.createQuery("SELECT p FROM Professor p WHERE p.RA = :raProfessor AND p.senha = :senha");
			logado.setParameter("raProfessor", raProfessor);
			logado.setParameter("senha", senhaProfessor);
			professor = (Professor) logado.getSingleResult();
			em.close();
			return professor.getLogado();
		}catch(Exception e){
			return 0;
		}
	}
	public boolean alunoFinalizaSessao(long raAluno, String senhaAluno){
		try{
			Aluno aluno = null;
			EntityManager em = factory.createEntityManager();
			Query look = em.createQuery("SELECT p FROM Aluno p WHERE p.RA = :ra AND p.senha = :senha");
			look.setParameter("ra", raAluno);
			look.setParameter("senha", senhaAluno);
			aluno = (Aluno) look.getSingleResult();
			if (aluno == null){ 
				gravaLog(lblLog._erroQueryVazia, null, lblLog._tipoQuery);
				return false;
			}
			aluno.setLogado(0);
			em.getTransaction().begin();
			em.merge(aluno);
			em.getTransaction().commit();
			em.close();
			gravaLog(lblLog._alunoLogout+raAluno, null, lblLog._tipoCadastro);
			return true;
		}catch(Exception e){
			gravaLog("Erro logout: "+raAluno, null, lblLog._tipoExcecao);
			return false;
		}
	}
	public boolean professorFinalizaSessao(long raProfessor, String senhaProfessor){
		try{
			Professor professor = null;
			EntityManager em = factory.createEntityManager();
			Query look = em.createQuery("SELECT p FROM Professor p WHERE p.RA = :ra AND p.senha = :senha");
			look.setParameter("ra", raProfessor);
			look.setParameter("senha", senhaProfessor);
			professor = (Professor) look.getSingleResult();
			if (professor == null) {
				gravaLog(lblLog._erroQueryVazia, null, lblLog._tipoQuery);
				return false;
			}
			professor.setLogado(0);
			em.getTransaction().begin();
			em.merge(professor);
			em.getTransaction().commit();
			em.close();
			gravaLog(lblLog._alunoLogout+raProfessor, null, lblLog._tipoCadastro);
			return true;
		}catch(Exception e){
			gravaLog("Erro logout: "+raProfessor, null, lblLog._tipoExcecao);
			return false;
		}
	}
	private void gravaLog(String dadosLog, String detalhe, int tipo){
		try{
			Log log = new Log(dadosLog, detalhe, tipo);
			EntityManager em = factory.createEntityManager();
			em.getTransaction().begin();
			em.persist(log);
			em.getTransaction().commit();
			em.close();
		}catch(Exception e){
			return;
		}
	}
}
